#include <bits/stdc++.h>
using namespace std;

/*
165. 比较版本号
已解答
中等
相关标签
premium lock icon
相关企业
提示
给你两个 版本号字符串 version1 和 version2 ，请你比较它们。版本号由被点 '.' 分开的修订号组成。修订号的值 是它 转换为整数 并忽略前导零。

比较版本号时，请按 从左到右的顺序 依次比较它们的修订号。如果其中一个版本字符串的修订号较少，则将缺失的修订号视为 0。

返回规则如下：

如果 version1 < version2 返回 -1，
如果 version1 > version2 返回 1，
除此之外返回 0。
 

示例 1：

输入：version1 = "1.2", version2 = "1.10"

输出：-1

解释：

version1 的第二个修订号为 "2"，version2 的第二个修订号为 "10"：2 < 10，所以 version1 < version2。

示例 2：

输入：version1 = "1.01", version2 = "1.001"

输出：0

解释：

忽略前导零，"01" 和 "001" 都代表相同的整数 "1"。

示例 3：

输入：version1 = "1.0", version2 = "1.0.0.0"

输出：0

解释：

version1 有更少的修订号，每个缺失的修订号按 "0" 处理。

 

提示：

1 <= version1.length, version2.length <= 500
version1 和 version2 仅包含数字和 '.'
version1 和 version2 都是 有效版本号
version1 和 version2 的所有修订号都可以存储在 32 位整数 中
*/

// 法一
class Solution {
private:
    using ll = long long;
    // 从版本字符串的当前位置提取一个修订号（转long long避免溢出）
    ll getRevisionNum(string& version, int& idx) {
        ll num = 0;
        // 连续数字字符 -->整数
        while (idx < version.size() && version[idx] != '.') {
            num = num * 10 + (version[idx] - '0');
            idx++;
        }
        // continue '.'
        if (idx < version.size())   idx++;
        return num;
    }

public:
    int compareVersion(string version1, string version2) {
        // 遍历迭代来比较版本号
        int i = 0, j = 0;
        int n1 = version1.size(), n2 = version2.size();

        while (i < n1 || j < n2) {
            // 修订号 转整数 忽略前导零
            ll num1 = getRevisionNum(version1, i);
            ll num2 = getRevisionNum(version2, j);

            // com 修订号
            if (num1 > num2)    return 1;
            if (num1 < num2)    return -1;
        }
        return 0;
    }
};